<?php
declare(strict_types=1);

namespace app\common\business;

use app\common\model\mysql\SpecsValue as SpecsValueModel;
use think\Exception;

class SpecsValue extends BusiBase
{
    public function __construct()
    {
        $this->model = new SpecsValueModel();
    }

    /**
     * 通过规格 ID 获取所有规格属性
     *
     * @param int $id
     * @return array
     */
    public function getBySpecsId(int $id)
    {
        try{
            $res = $this->model->getNormalBySpecsId($id, 'id,name');
        } catch (\Exception $e) {
            $this->errorLog("select specs value id=$id error: ".$e->getMessage());
            return [];
        }
        $data = $res->toArray();
        return $data;
    }

    /**
     * 规格属性添加
     *
     * @param array $data
     * @return false|mixed
     */
    public function add(array $data)
    {
        // 查找当前数据是否存在
        $find = $this->model->where($data)->find();
        if ($find) throw new Exception('该属性已存在');

        $insertId = $this->insert($data);
        return $insertId;
    }

    /**
     * 根据属性 ID 删除规格属性
     *
     * @param int $specsValueId
     * @return bool
     */
    public function deleteBySpecsValueId(int $specsValueId)
    {
        try{
            $res = $this->model->destroy($specsValueId);
        } catch (\Exception $e) {
            $this->errorLog("delete specs value error: ".$e->getMessage());
            return false;
        }
        return $res;
    }

    /**
     * 获取商品 sku 信息
     *
     * @param array $specsPathIds
     * @return array
     */
    public function getSpecsValueBySpecsPathIds(array $specsPathIds, array $flagIdArr = [])
    {
        // 获取 sku 数据数组的键
        $specsValueArr = array_keys($specsPathIds);
        $list = $data = [];
        // 循环所有的 sku 属性字符串
        foreach ($specsValueArr as $specsValueIds) {
            // 分割当前属性字符串并循环
            foreach (explode(',', (string) $specsValueIds) as $specsValueKey=>$specsValueVal) {
                // 按顺序生成当前商品的 n 级属性
                $data[$specsValueKey][] = $specsValueVal;
            }
        }
        // 循环当前商品的所有属性类型
        foreach ($data as $dk=>$dv) {
            // 当前属性值去重后获取属性信息
            $result = $this->getSpecsValueBySpecsValudId(array_unique($dv));
            $list[$dk] = [];
            foreach ($result as $rk=>$rv) {
                $list[$dk]['name'] = $rv['name'];
                $list[$dk]['list'][] = [
                    'id'   => $rk,
                    'name' => $rv['name'],
                    'flag' => $flagIdArr[$dk] == $rk ? 1 : 0
                ];
            }
        }
        return $list;
    }

    /**
     * 根据规格组 ID 获取规格信息
     *
     * @param array $specsValudIds
     * @return array
     */
    public function getSpecsValueBySpecsValudId(array $specsValudIds)
    {
        if (!$specsValudIds) return [];
        $result = $this->getNormalByIdArr($specsValudIds);
        if (!$result) return [];
        // 获取所有规格对应 id 的数组
        $specsNameArr = array_column(config('specs'), 'name', 'id');
        $data = [];
        foreach ($result as $resval) {
            $data[$resval['id']] = [
                'name' => $resval['name'],
                'specs_name' => $specsNameArr[$resval['specs_id']]
            ];
        }
        return $data;
    }

    /**
     * 根据属性 ID 获取属性信息 （用于购物车）
     *
     * @param array $specsValueIdArr
     * @return array
     */
    public function getCartSpecsValue(array $specsValueIdArr)
    {
        if (!$specsValueIdArr) return [];
        $idStr = implode(",", $specsValueIdArr);
        $idArr = explode(",", $idStr);
        $idArr = array_unique($idArr);

        $idInfoArr = $this->getSpecsValueBySpecsValudId($idArr);
        if (!$idInfoArr) return [];
        $result = [];
        foreach ($specsValueIdArr as $specsValueId=>$specsValueStr)
        {
            $specsValueIds = explode(',', $specsValueStr);
            $specsStrArr = [];
            foreach ($specsValueIds as $specsValue) {
                $specsStrArr[] = $idInfoArr[$specsValue]['specs_name'].":".$idInfoArr[$specsValue]['name'];
            }
            $result[$specsValueId] = implode("  ", $specsStrArr);
        }
        return $result;
    }
}